package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.GoodsTypeVo;
import com.atguigu.jxc.service.GoodsTypeService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


/**
 * @author nzmxfan
 * @create 2021-09-03-23:08
 */
@Service
@Slf4j
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    GoodsTypeDao goodsTypeDao;

    @Override
    public String loadGoodsType() {
        // 顶层节点的父 id 为 -1
        List<GoodsTypeVo> goodsTypeVo = goodsTypeDao.getAllGoodsType(-1);

        String typeJson = null;
        try {
            typeJson = new ObjectMapper().writeValueAsString(goodsTypeVo);
        } catch (JsonProcessingException e) {
            log.info(e.getMessage());
        }
        return typeJson;
    }

    @Override
    @Transactional
    public void save(String goodsTypeName, Integer pId) {
        // 自己节点状态为 0
        goodsTypeDao.save(goodsTypeName, pId, 0);
        // 根据父 id 获取父节点
        GoodsType goodsType = goodsTypeDao.selectByGoodsTypeId(pId);
        // 父节点状态改了 1
        goodsType.setGoodsTypeState(1);
        // 更新父节点属性
        goodsTypeDao.updateGoodsTypeState(goodsType);
    }

    @Override
    public void deleteByGoodsTypeId(Integer goodsTypeId) {
        // 根据 id 获取 GoodsType 对象
        GoodsType goodsType = goodsTypeDao.selectByGoodsTypeId(goodsTypeId);
        // 获取即将删除的分类 id
        Integer id = goodsType.getGoodsTypeId();
        // 获取即将删除的分类的父类 id
        Integer pId = goodsType.getPId();
        // 获取父类对象
        GoodsType goodsParentType = goodsTypeDao.selectByGoodsTypeId(pId);
        // 删除自己这个分类
        goodsTypeDao.deleteByGoodsTypeId(goodsTypeId);
        // 根据父 id 获取除了已经删除的子分类的集合（先删除需要删除的子分类，避免还需要判断）
        List<GoodsType> goodsSonType = goodsTypeDao.selectByPId(goodsParentType.getGoodsTypeId());
        // 查看该父分类是否有子分类（没有则将自身状态改为 0，有则无需修改）
        if (goodsSonType.size() == 0){
            // 不存在子分类，更新状态为 0
            goodsParentType.setGoodsTypeState(0);
            goodsTypeDao.updateGoodsTypeState(goodsParentType);
        }
    }


}
